﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using Bukstor.Biz;
using System.Text;
using System.Globalization;

namespace Bukstor.Admin.UI
{
    public partial class Informes : System.Web.UI.Page
    {
        DateTime desde;
        DateTime hasta;
        decimal monto;
        int dia = 1;
        decimal montoTotal;
            
        protected void Page_Load(object sender, EventArgs e)
        {
            ((Label)Master.FindControl("lblTitulo")).Text = "INFORMES";
            if (!IsPostBack)
            {
                txtDesde.Text = DateTime.Today.AddYears(-1).ToString("s");
                txtHasta.Text = DateTime.Today.ToString("s");
            }
        }

        public DataSet MostrarTabla()
        {
            DataSet ds=new DataSet("Informes");
            SqlConnection conn = new SqlConnection(Properties.Settings.Default.connAdmin);
            string strQuery = "Select * from CantidadVendidaXTituloFecha";
            SqlDataAdapter da = new SqlDataAdapter(strQuery, conn);
            da.Fill(ds);
            agregarColumnaMonto(ds);
            return ds;
        }

        public DataSet filtrarTabla(string d, string h, string dateGroupType, string librosElegidos)
        {
            DateTime desde, hasta;
            int dateGroup;
            string dateField = "";
            #region Validar Parametros
            if (d == null || d == "") desde = DateTime.Today.AddYears(-1); else desde = DateTime.Parse(d);
            if (h == null || h == "") hasta = DateTime.Today; else hasta = DateTime.Parse(h);
            dateGroup = int.Parse(dateGroupType);
            #endregion
            switch (dateGroup)
            {
                case 1:
                    dateField = "CantidadVendidaXTituloFecha.fecha AS Dia";
                    break;
                case 2:
                    dateField = "MONTH(CantidadVendidaXTituloFecha.fecha) AS Mes";
                    break;
                case 3:
                    dateField = "YEAR(CantidadVendidaXTituloFecha.fecha) AS Año";
                    break;
            }

            DataSet ds = new DataSet("Filtrado");
            SqlConnection conn = new SqlConnection(Properties.Settings.Default.connAdmin);
            StringBuilder strQuery = new StringBuilder();

            strQuery.Append("SELECT CantidadVendidaXTituloFecha.idLibro AS ID, ");
            if (dateGroup != 0) strQuery.Append(dateField).Append(", ");
            strQuery.Append("CantidadVendidaXTituloFecha.titulo AS Titulo, ");
            strQuery.Append("SUM(CantidadVendidaXTituloFecha.cantidadVendida) AS Cantidad ");
            strQuery.Append("FROM         CantidadVendidaXTituloFecha ");
            strQuery.Append("WHERE (CantidadVendidaXTituloFecha.fecha >= @desde) AND (CantidadVendidaXTituloFecha.fecha <= @hasta) ");
            if (librosElegidos != null && librosElegidos != "")
                strQuery.Append("AND (CantidadVendidaXTituloFecha.idLibro IN (").Append(librosElegidos).Append(")) ");
            if (dateGroup != 0) strQuery.Append("GROUP BY ").Append(dateField.Substring(0, dateField.IndexOf(" AS")));
            if (dateGroup == 0) strQuery.Append("GROUP BY "); else strQuery.Append(", ");
            strQuery.Append("CantidadVendidaXTituloFecha.titulo, CantidadVendidaXTituloFecha.idLibro");

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = strQuery.ToString();
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue("@desde", desde);
            cmd.Parameters.AddWithValue("@hasta", hasta);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds);
            agregarColumnaMonto(ds);
            return ds;
        }

        protected void btnMostrar_Click(object sender, EventArgs e)
        {
            StringBuilder librosElegidos = new StringBuilder();
            foreach (int index in lbTitulos.GetSelectedIndices())
            {
                if (librosElegidos.Length > 0) librosElegidos.Append(',');
                librosElegidos.Append(lbTitulos.Items[index].Value);
            }
            hidTitulosSeleccionados.Value = librosElegidos.ToString();
            GridView1.DataSourceID = "OdsFiltrarFecha";            
        }

        protected void btnDesde_Click(object sender, EventArgs e)
        {
            Calendar1.Visible = true;            
        }

        protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            desde = Calendar1.SelectedDate;
            txtDesde.Text = desde.ToString("s");
            Calendar1.Visible = false;
        }

        protected void btnHasta_Click(object sender, EventArgs e)
        {
            Calendar2.Visible = true;
        }

        protected void Calendar2_SelectionChanged(object sender, EventArgs e)
        {
            DateTime hasta = Calendar2.SelectedDate;
            txtHasta.Text = hasta.ToString("s");
            Calendar2.Visible = false;
        }

        protected DataSet agregarColumnaMonto(DataSet ds)
        {
            decimal montoTotal = 0;
            int cantidadTotal = 0;
            DataSet dsMontos = new DataSet("Montos");
            DataTable dtMontos = new DataTable("Montos");
            dtMontos = ds.Tables["Table"];
            DataColumn ColMonto = new DataColumn("monto", typeof(string));
            dtMontos.Columns.Add(ColMonto);
            //recorro la dtMontos cuando idLibro(inventario)=idLibro(ds)
            DataRow[] filas = dtMontos.Select(null, null, DataViewRowState.CurrentRows);

            foreach (DataRow f in filas)
            {
                //precio de la columna que corresponde cuando id = idLibro
                int col = -1;
                col++;
                int id = int.Parse(f[0].ToString());
                BukstorBDEntities Entidad = new BukstorBDEntities();
                //En la Tabla Inventarios esta el precio que corresponde
                decimal precio = (from I in Entidad.Inventarios
                                  where I.idLibro == id
                                  select I.precioUnitario).First();
                //Extraigo cantidadVendida de la columna correspondiente de DataTable para multiplicarla por el precio 
                int cantidad = 0;
                decimal total = 0;
                for (int i = 0; i < dtMontos.Rows.Count; i++)
                {
                    //asigno cantidad al valor de la fila correspondiente
                    cantidad = int.Parse(f["Cantidad"].ToString());
                    total = precio * cantidad;
                    //acumulo el monto total (una sola vez)
                    if (i == dtMontos.Rows.Count - 1)
                    {
                        montoTotal += total;
                        cantidadTotal += cantidad;
                    }
                    //Se agrega el valor total a la columna monto en la fila que corresponde
                    f["monto"] = total.ToString("c");
                }

            }
            //Se crea la ultima fila con el monmto total vendido
            DataRow ultimaFila = dtMontos.NewRow();
            ultimaFila["Titulo"] = "GRAN TOTAL";
            ultimaFila["Cantidad"] = cantidadTotal;
            ultimaFila["monto"] = montoTotal.ToString("c");
            dtMontos.Rows.Add(ultimaFila);
            return dsMontos;
        }
        
        public DataSet informeMensual(string ini, string fin)
        {
            DataSet dsMensual = new DataSet("informeMensual");
            SqlConnection conn = new SqlConnection(Properties.Settings.Default.connAdmin);
            string strQuery = "Select idLibro, titulo, SUM(cantidadVendida) as cantidad FROM CantidadVendidaXTituloFecha where (fecha > '" + ini + "' AND fecha < '" + fin + "') GROUP BY idLibro, titulo";
            SqlDataAdapter da = new SqlDataAdapter(strQuery, conn);
            da.Fill(dsMensual);
            agregarColumnaMonto(dsMensual);
            return dsMensual;
        }

        protected void btnInformeMensual_Click(object sender, EventArgs e)
        {
            
            int mes = int.Parse(ddlMes.SelectedValue);
            int ano = int.Parse(ddlAno.SelectedValue);
            
            if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
            { dia = 31; }
            if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
            { dia = 30; }
            if(mes==2)
            { dia=28; }

            DateTime desde = new DateTime(ano, mes, 1);
            DateTime hasta = new DateTime(ano, mes, dia);

            txtDesde.Text = desde.ToString("s");
            txtHasta.Text = hasta.ToString("s");
            GridView1.DataSourceID = "OdsInformeMensual";
            
        }

        protected void chkFiltrarTitulos_CheckedChanged(object sender, EventArgs e)
        {
            lbTitulos.Enabled = chkFiltrarTitulos.Checked;
            if (!chkFiltrarTitulos.Checked)
            {
                lbTitulos.ClearSelection();
            }
        }
    }
}